/**
 * @func 工具集扩展
 * @author yinjiazeng
 */

import {
    util, 
    router, 
    template, 
    request,
    layer, 
    confirm
} from 'nuijs';

/**
 * @func 检测是否是首页
 */
util.checkHome = function(){
    let active = router.active();
    if(active && active.path.indexOf('/index') === 0){
        return active
    }
    return false
}

/**
 * @func 去用户中心登录
 */
util.toLogin = function(){
    request.get('sso/url/encode', {url:location.protocol + '//' + location.host + '?referer=' + location.hash.replace(/^#!/, '')}, {
        '200':(res)=>{
            let jumpurl = '&jumpurl=' + res.data
            location.replace(userCenter + 'Contents/usercenter/allow/login/login.jsp?redirecturl=dzfp' + jumpurl)
        }
    }, null)
}

util.supportAnimate = util.supportCss3('animation');

util.scrollbarWidth = (function(){
    var oldWidth, newWidth, div = document.createElement('div');
    div.style.cssText = 'position:absolute; top:-10000em; left:-10000em; width:100px; height:100px; overflow:hidden;';
    oldWidth = document.body.appendChild(div).clientWidth;
    div.style.overflowY = 'scroll';
    newWidth = div.clientWidth;
    document.body.removeChild(div);
    return oldWidth - newWidth
})()


util.createStyle = function(selector, rules){
    let sheet;
    if(document.createStyleSheet){
        sheet = document.createStyleSheet()
    }
    else{
        var style = document.createElement('style');
        document.head.appendChild(style);
        sheet = style.sheet;
    }
    try{
        if('addRule' in sheet){
            sheet.addRule(selector, rules)
        }
        else if('insertRule' in sheet){
            sheet.insertRule(selector + '{' + rules + '}')
        }
    }
    catch(e){
        
    }
}

util.submit = function(url, data, target='_blank'){
    if(url && data){
        if(!url.match(/\.\w+|\/$/)){
            url += request.config('ext')
        }
        if(!url.match(/^(https?:\/)?\//)){
            url = serviceUrl + url
        }
        let from = template.render(
            `
            <form method="post" target="${target}" action="${url}">
                <%each data%>
                <input type="hidden" name="<%$index%>" value='<%$value%>'>
                <%/each%>
            </form>
            `,
            {
                data:data
            }
        )
        let $form = $(from).appendTo('body');
        $form.submit();
        $form.remove();
    }
}

util.preview = function(url){
    if(util.isInstallPDF()){
        confirm({
            content:'你当前无法直接查看电子发票，建议下载PDF文件！',
            button:[{
                text:'下载',
                callback(){
                    window.open(url)
                    return true
                }
            }]
        })
    }
    else{
        layer({
            title:'发票查验详情',
            width:900,
            height:600,
            iframe:{
                enable:true,
                src:url
            },
            button:null,
            cancel:{
                enable:false
            }
        })
    }
}

util.download = function(filename, ext){
    return basePath + 'files/' + filename + (ext ? '.' + ext : '.xlsx') + '?_=' + new Date().getTime()
}

/**
 * @func 根据税率计算含税或者不含税金额
 * @param {Number} num 金额
 * @param {Number} slv 税率
 * @param {Boolean} tax 是否计算含税金额
 */
util.count = function(num, slv, tax){
    num = parseFloat(num || 0)
    slv = parseFloat(slv || 0)
    if(isNaN(num)){
        return 0
    }
    if(isNaN(slv) || !slv){
        return num
    }
    if(tax){
        return util.numMulti(num ,1 + slv);
    }
    return util.numDiv(num , 1 + slv);
}

/**
 * @func 计算税额
 * @param {Number} num 金额
 * @param {Boolean} slv 税率
 */
util.tax = function(num, slv){
    num = parseFloat(num || 0)
    slv = parseFloat(slv || 0)
    if(isNaN(num) || isNaN(slv) || !slv){
        return 0
    }
    return num * slv
}

/**
* 含税时   含税金额。
* @param num数量 | unitPrT含税单价
*/
util.funTPriceT = function (num,unitPrT) {
	return util.round(util.numMulti(num,unitPrT),2)
} 
/**
* 含税时   税额。
* @param num数量 | unitPrT含税单价 | imbalance差额 | taxrate税率
*/
util.funTTax = function (num,unitPrT,imbalance,taxrate) {
	return util.round(util.numDiv(util.numMulti(util.numMulti(num,unitPrT) - imbalance,taxrate),1+taxrate),2)
}
/**
* 含税时   税额(有含税金额)。
* @param priceT含税金额 | imbalance差额 | taxrate税率
*/
util.funTTaxB = function (priceT,imbalance,taxrate) {
	return util.round(util.numDiv(util.numMulti(priceT- imbalance,taxrate),1+taxrate),2)
} 
/**
* 含税时   不含税单价（有差额）。
* @param priceT含税金额 | tax税额 | num数量
*/
util.funTUnitPrDiff = function (priceT,tax,num) {
	return util.round(util.numDiv(priceT - tax,num),15)	
} 
/**
* 含税时   不含税单价（无差额）。
* @param unitPrT含税单价 | taxrate税率
*/
util.funTUnitPr = function (unitPrT,taxrate) {
	return util.round(util.numDiv(unitPrT,1+taxrate),15)
} 
/**
* 含税时   不含税金额。
* @param priceT含税金额 | tax税额
*/
util.funTPrice = function (priceT,tax) {
	return (priceT - tax).toFixed(2);
} 
/**
* 不含税时   不含税金额。
* @param num数量 | unitPr不含税单价
*/
util.funPrice = function (num,unitPr) {
	return util.round(util.numMulti(num,unitPrT),2)
} 
/**
* 不含税时   税额。
* @param num数量 | unitPr不含税单价 | imbalance差额 | taxrate税率
*/
util.funTax = function (num,unitPr,imbalance,taxrate) {
	return util.round(util.numMulti(util.numMulti(num,unitPr) - imbalance,taxrate),2)
} 
/**
* 不含税时   税额(有不含税金额)。
* @param price不含税金额 | imbalance差额 | taxrate税率
*/
util.funTaxB = function (price,imbalance,taxrate) {
	return util.round(util.numMulti(price - imbalance,taxrate),2)
} 
/**
* 不含税时   含税单价（有差额）。
* @param price不含税金额 | tax税额 | num数量
*/
util.funUnitPrTDiff = function (price,tax,num) {
	return util.round(util.numDiv(price + tax,num),15)	
} 
/**
* 不含税时   含税单价（无差额）。
* @param unitPr不含税单价 | taxrate税率
*/
util.funUnitPrT = function (unitPr,taxrate) {
	return util.round(util.numMulti(unitPr,1+taxrate),15)
} 
/**
* 不含税时   含税金额。
* @param priceT含税金额 | tax税额
*/
util.funPrice = function (price,tax) {
	return (parseFloat(price) + parseFloat(tax)).toFixed(2);
}  

/**
* 乘法运算，避免数据相乘小数点后产生多位数和计算精度损失。
*
* @param num1被乘数 | num2乘数
*/
util.numMulti = function(num1, num2){
    var baseNum = 0;
    try {
        baseNum += num1.toString().split(".")[1].length;
    } 
    catch (e) {

    }
    try {
        baseNum += num2.toString().split(".")[1].length;
    } 
    catch (e) {

    }
    return Number(num1.toString().replace(".", "")) * Number(num2.toString().replace(".", "")) / Math.pow(10, baseNum);
}

/**
* 除法运算，避免数据相除小数点后产生多位数和计算精度损失。
*
* @param num1被除数 | num2除数
*/
util.numDiv = function(num1, num2){
    var baseNum1 = 0, baseNum2 = 0, baseNum3 = 0;
    var baseNum4, baseNum5, baseNum6, baseNum7;
    var leftNum = 0, rightNum = 0;
    try {
        baseNum1 = num1.toString().split(".")[1].length;
    } catch (e) {
        baseNum1 = 0;
    }
    try {
        baseNum2 = num2.toString().split(".")[1].length;
    } catch (e) {
        baseNum2 = 0;
    }
    baseNum4 = Number(num1.toString().replace(".", ""));
    baseNum5 = Number(num2.toString().replace(".", ""));
    baseNum6 = baseNum4 / baseNum5;
    if (baseNum6.toString().indexOf('e')>-1) {
        leftNum = baseNum6.toString().split('e')[0]
        rightNum = Number(baseNum6.toString().split('e')[1].substr(1));
        try {
            baseNum3 = leftNum.toString().split(".")[1].length;
        } catch (e) {
            baseNum3 = 0;
        }
    } else{
        try {
            baseNum3 = baseNum6.toString().split(".")[1].length;
            

        } catch (e) {
            baseNum3 = 0;
        }
        leftNum = baseNum6;
    }

    baseNum7 = leftNum.toString().replace(".", "")
    return baseNum7 / Math.pow(10, baseNum1 - baseNum2 + baseNum3+rightNum);
}

/**
* 四舍五入。
*
* @param v要转换的值 | num2保留的位数
*/
util.round = function(v,e){
	var t=1;
	for(;e>0;t*=10,e--);
	for(;e<0;t/=10,e++);
	return Math.round(v*t)/t;
}
util.lenRange = function(value,element,params){
    let len = value.replace(/[^\x00-\xff]/g,'**').length;
    if(typeof params === 'number'){
        if(len > params){
            return false;
        }
        return true
    }
    else if(Nui.type(params,'Array')){
        let min=params[0],max=params[1];
        if(min>max){
            let tmp = min;
            min = max;
            max = min;
        }
        if(len>=min && len<=max){
            return true;
        }
    }else if(typeof params == 'string'){
        if(params.indexOf(',')>-1){
            let tmp = params.split(',');
            let f = false;
            Nui.each(tmp,(v)=>{
                if(len == v){
                    f = true;
                }
            })
            return f;
        }
        else{
            if(len > parseInt(params)){
                return false;
            }
            return true;
        }
    }
    return false;
}
/**
 * 返回截取的位置，包括中文
 * @param content被截取的长度 | num要截取的长度
 */
util.getStrIndex = function(content,num){
	let valLength=0;
    for(let i=0;i<content.length;i++){
        if(/[^\x00-\xff]/g.test(content[i])){
            valLength+=2;
        }else{
            valLength++;
        }
        if(valLength==num){
            return i+1;
        }else if(valLength>num){
            return i;
        }
    }
    return content.length
}
//汉子、字符校验
util.checkLength = function (val){
	var valLength=0;
	for(var ii=0;ii<val.length;ii++){
		if(/[^\x00-\xff]/g.test(val[ii])){
			valLength+=2;
		}else{
			valLength++;
		}
	}
	return valLength;
}
// 页面跳转
util.jumpUrl = function(url, target){
    if(url){
        $('<a href="'+ url +'"'+ (target ? 'target="'+ (target||'_self') +'"' : '' ) +'><span></span></a>')
            .appendTo('body').children().click().end().remove();
    }
}
//特殊字符反转译
util.HTMLDecode = function (text) { 
    var temp;
    if(!document.getElementById('htmlDecodeDiv')){
        temp = document.createElement('div'); 
        temp.id='htmlDecodeDiv';
        temp.className = 'f-dn'; 
    }else{
        temp=document.getElementById('htmlDecodeDiv');
    }
    temp.innerHTML = text;    
    var output = temp.innerText || temp.textContent;
    return output; 
}

//serialize  反编译
util.deparam = function (query) {
    var pairs, i, keyValuePair, key, value, map = {};
    // remove leading question mark if its there
    if (query.slice(0, 1) === '?') {
        query = query.slice(1);
    }
    if (query !== '') {
        pairs = query.split('&');
        for (i = 0; i < pairs.length; i += 1) {
            keyValuePair = pairs[i].split('=');
            key = decodeURIComponent(keyValuePair[0]);
            value = (keyValuePair.length > 1) ? decodeURIComponent(keyValuePair[1]) : undefined;
            map[key] = value;
        }
    }
    return map;
}

//后台返回的转译字符返转义
util.decodeStr = function (content) { 
    return content.replace(/&quot;/g,'"').replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&nbsp;/g," ").replace(/&hellip;/g,"…").replace(/&mdash;/g,"—").replace(/&rdquo;/g,"”").replace(/&lsquo;/g,"‘").replace(/&ldquo;/g,"“");
}

/**
 * 小数自动补0
 * @param content被截取的长度 | num要截取的长度
 */
util.numAdd0=function(num){
    let i = num.indexOf('.');
    if(i==0){
        return '0' + num.substr(i);
    }else{
        return num
    }
}
// 百度统计，页面浏览量统计
util.pageView = function(){
    var _hmt = _hmt || [];
    _hmt.push(['_setAccount', '09d3edd3a5752419698c3749f739a285']);
    (function() {
        var hm = document.createElement("script");
        hm.src = "https://hm.baidu.com/hm.js?09d3edd3a5752419698c3749f739a285";
        var s = document.getElementsByTagName("script")[0]; 
        s.parentNode.insertBefore(hm, s);
    })();
}
// 百度统计，按钮点击量
util.statisticsBtn = function( page,elem,modules  ){
    var label = $(elem).data("track")

    window._hmt && window._hmt.push(['_trackEvent', page , modules ,$(elem).html() || $(elem).val()])
}

module.exports = util